<?php

defined('WEKIT_VERSION') || exit('Forbidden');

Wind::import('ADMIN:library.AdminBaseController');

/**
 * 投票系统后台.
 *
 * @author mingxing.sun <mingxing.sun@aliyun-inc.com>
 * @copyright ©2003-2103 phpwind.com
 * @license http://www.windframework.com
 *
 * @version $Id: ManageController.php 4731 2012-02-23 08:36:01Z mingxing.sun $
 */
class ManageController extends AdminBaseController
{
    public function run()
    {
        $map = (array) $this->_getFroumService()->getForumMap();
        $forumList = array();
        foreach ($map[0] as $key => $value) {
            $forumList[$value['fid']] = $this->_getFroumService()->getForumsByLevel($value['fid'], $map);
        }

        $forumIds = array();
        foreach ($forumList as $forum) {
            foreach ($forum as $value) {
                $forumIds[] = $value['fid'];
            }
        }

        $pollOpenForum = $this->_getPollOpenForum($forumIds);

        $cateIds = array();
        foreach ($map[0] as $value) {
            foreach ($forumList[$value['fid']] as $val) {
                if (!in_array($val['fid'], array_keys($pollOpenForum))) {
                    continue;
                }
                $cateIds[] = $value['fid'];
            }
        }
        $cateIds = array_unique($cateIds);

        $this->setOutput($forumList, 'forumList');
        $this->setOutput($map[0], 'cateList');
        $this->setOutput($cateIds, 'cateIds');
        $this->setOutput($pollOpenForum, 'pollOpenForum');
        $this->setOutput($this->_buildGroup($this->_getUserGroupsDs()->getAllGroups()), 'groups');
        $this->setOutput($this->_getUserGroupsDs()->getTypeNames(), 'groupsTypeName');
        $this->setOutput($this->_buildPermission($this->_getUserPermissionDs()->fetchPermissionByRkey(array('allow_add_vote', 'allow_participate_vote', 'allow_view_vote'))), 'permission');
    }

    public function dogroupAction()
    {
        $this->getRequest()->isPost() || $this->showError('operate.fail');
        $view = $this->getInput('view', 'post');

        $groups = $this->_getUserGroupsDs()->getAllGroups();

        Wind::import('SRV:usergroup.dm.PwUserPermissionDm');

        foreach ($groups as $value) {
            $dm = new PwUserPermissionDm($value['gid']);
            $dm->setPermission('allow_add_vote', in_array($value['gid'], $view['allow_add_vote']) ? 1 : 0);
            $dm->setPermission('allow_participate_vote', in_array($value['gid'], $view['allow_participate_vote']) ? 1 : 0);
            $dm->setPermission('allow_view_vote', in_array($value['gid'], $view['allow_view_vote']) ? 1 : 0);
            $this->_getUserPermissionDs()->setPermission($dm);
        }

        $this->showMessage('ADMIN:success');
    }

    public function editforumAction()
    {
        $map = (array) $this->_getFroumService()->getForumMap();
        $forumList = array();
        foreach ($map[0] as $key => $value) {
            $forumList[$value['fid']] = $this->_getFroumService()->getForumsByLevel($value['fid'], $map);
        }

        $forumIds = array();
        foreach ($forumList as $forum) {
            foreach ($forum as $value) {
                $forumIds[] = $value['fid'];
            }
        }

        $pollOpenForum = $this->_getPollOpenForum($forumIds);

        $this->setOutput($forumList, 'forumList');
        $this->setOutput($map[0], 'cateList');
        $this->setOutput($pollOpenForum, 'pollOpenForum');
    }

    public function doeditforumAction()
    {
        $this->getRequest()->isPost() || $this->showError('operate.fail');
        $forumid = $this->getInput('fid', 'post');
        $forumid = $forumid ? explode(',', $forumid) : array();

        $forum = (array) $this->_getFroumService()->getForumList();

        $openForum = $noOpenForum = array();
        foreach ($forum as $value) {
            if ($value['type'] == 'category') {
                continue;
            }
            if (in_array($value['fid'], $forumid)) {
                $openForum[] = $value['fid'];
            } else {
                $noOpenForum[] = $value['fid'];
            }
        }

        Wind::import('SRV:forum.dm.PwForumDm');
        if ($openForum) {
            foreach ($openForum as $value) {
                $_forum = $this->_getForumDs()->getForum($value, 4);
                if (!$_forum) {
                    continue;
                }

                $setting = unserialize($_forum['settings_basic']);
                $allowType = is_array($setting['allowtype']) ? $setting['allowtype'] : array();
                if (in_array('poll', $allowType)) {
                    continue;
                }
                $allowType[] = 'poll';
                !isset($setting['typeorder']['poll']) && $setting['typeorder']['poll'] = 0;
                $setting['allowtype'] = $allowType;

                $dm = new PwForumDm($value);
                $dm->setBasicSetting($setting);
                $this->_getForumDs()->updateForum($dm, 4);
            }
        }

        if ($noOpenForum) {
            foreach ($noOpenForum as $value) {
                $_forum = $this->_getForumDs()->getForum($value, 4);
                if (!$_forum) {
                    continue;
                }

                $setting = unserialize($_forum['settings_basic']);
                $allowType = is_array($setting['allowtype']) ? $setting['allowtype'] : array();
                if (!in_array('poll', $allowType)) {
                    continue;
                }

                $allowType = array_diff($allowType, array('poll'));
                unset($setting['typeorder']['poll']);
                $setting['allowtype'] = $allowType;

                $dm = new PwForumDm($value);
                $dm->setBasicSetting($setting);
                $this->_getForumDs()->updateForum($dm, 4);
            }
        }

        $this->showMessage('ADMIN:success');
    }

    private function _buildGroup($data)
    {
        if (empty($data) || !is_array($data)) {
            return array();
        }

        $result = array();
        foreach ($data as $value) {
            if ($value['type'] == 'vip') {
                continue;
            }
            $result[$value['type']][] = $value;
        }

        return $result;
    }

    private function _buildPermission($data)
    {
        if (empty($data) || !is_array($data)) {
            return array();
        }

        $result = array();
        foreach ($data as $value) {
            if (!$value['rvalue']) {
                continue;
            }
            $result[$value['rkey']][] = $value['gid'];
        }

        return $result;
    }

    private function _getPollOpenForum($forumIds)
    {
        if (empty($forumIds) || !is_array($forumIds)) {
            return array();
        }

        $forumExtra = $this->_getForumDs()->fetchForum($forumIds, 4);

        $result = array();
        foreach ($forumExtra as $value) {
            $setting = (array) unserialize($value['settings_basic']);
            $allowType = $setting['allowtype'];
            if (is_array($allowType) && in_array('poll', $allowType)) {
                $result[$value['fid']] = $value['fid'];
            }
        }

        return $result;
    }

    /**
     * get PwUserGroups.
     *
     * @return PwUserGroups
     */
    protected function _getUserGroupsDs()
    {
        return Wekit::load('usergroup.PwUserGroups');
    }

    /**
     * get PwForumService.
     *
     * @return PwForumService
     */
    protected function _getFroumService()
    {
        return Wekit::load('forum.srv.PwForumService');
    }

    /**
     * get PwUserPermission.
     *
     * @return PwUserPermission
     */
    protected function _getUserPermissionDs()
    {
        return Wekit::load('usergroup.PwUserPermission');
    }

    /**
     * get PwForum.
     *
     * @return PwForum
     */
    protected function _getForumDs()
    {
        return Wekit::load('forum.PwForum');
    }
}
